package org.java.base.randAccessFile;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;


     /**
       * 利用RandomAccessFile实现文件的多线程下载，即多线程下载一个文件时，将文件分成几块，每块用不同的线程进行下载。
       * 下面是一个利用多线程在写文件时的例子，其中预先分配文件所需要的空间，然后在所分配的空间中进行分块，然后写入：
      */


public class FileWriteThread {

    public static void main(String[] args) throws IOException {

        // 预分配文件所占的磁盘空间，磁盘中会创建一个指定大小的文件
        RandomAccessFile raf = new RandomAccessFile("D:\\个人文件\\学习\\data\\nio\\abc.txt", "rw");
        raf.setLength(1024 * 1024); // 预分配 1M 的文件空间
        raf.close();

        // 所要写入的文件内容
        String s1 = "第一个字符串";
        String s2 = "第二个字符串";
        String s3 = "第三个字符串";
        String s4 = "第四个字符串";
        String s5 = "第五个字符串";

        new Thread(() -> new FileWriteThread(1024 * 1, s1.getBytes()).run()).start();
        new Thread(() -> new FileWriteThread(1024 * 2, s2.getBytes()).run()).start();
        new Thread(() -> new FileWriteThread(1024 * 3, s3.getBytes()).run()).start();
        new Thread(() -> new FileWriteThread(1024 * 4, s4.getBytes()).run()).start();
        new Thread(() -> new FileWriteThread(1024 * 5, s5.getBytes()).run()).start();



    }


    private int skip;
    private byte[] content;

    public FileWriteThread(int skip, byte[] content) {
        this.skip = skip;
        this.content = content;
    }


    public void run() {
        RandomAccessFile raf = null;
        try {
            raf = new RandomAccessFile("D:\\个人文件\\学习\\data\\nio\\abc.txt", "rw");
            raf.seek(skip);
            raf.write(content);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            try {
                raf.close();
            } catch (Exception e) {
            }
        }
    }

}
